package veterinaria.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import veterinaria.excepcion.DAOExcepcion;
import veterinaria.modelo.Calendario;
import veterinaria.modelo.Cliente;
import veterinaria.modelo.Especie;
import veterinaria.modelo.Paciente;

import veterinaria.modelo.Raza;
import veterinaria.modelo.Vacuna;
import veterinaria.modelo.Producto;
import veterinaria.util.ConexionBD;

public class CalendarioDAO extends BaseDAO{
	
	
	 public Collection<Calendario> buscarPorFecha(String pFech) throws DAOExcepcion {
	        String sqlDoc="Select CalFecVacuna,CalProVacuna,MPaciente_PacCodigo,MPaciente_MEspecie_EspCodigo,MPaciente_MRaza_RazCodigo,MPaciente_MCliente_CliCodigo,TVacuna_VacCodigo,TVacuna_MProducto_ProCodigo From MCalendario Where CalFecVacuna Like ?";
	        Collection<Calendario> lisDoc=new ArrayList<Calendario>();
	        Connection conDoc=null;
	        PreparedStatement comDoc=null;
	        ResultSet rstDoc=null;
	        try {
	            conDoc=ConexionBD.obtenerConexion();
	            comDoc=conDoc.prepareStatement(sqlDoc);
	            comDoc.setString(1, "%" + pFech + "%");
	            rstDoc=comDoc.executeQuery();
	            while (rstDoc.next()) {
	                Calendario regDoc = new Calendario();
	                regDoc.setCalCodigo(rstDoc.getInt("CalCodigo"));
	                regDoc.setCalFecVacuna(rstDoc.getString("CalFecVacuna"));
	                lisDoc.add(regDoc);
	            }
	        } catch (SQLException e) {
	            System.err.println(e.getMessage());
	            throw new DAOExcepcion(e.getMessage());
	            
	        } finally {
	            this.cerrarResultSet(rstDoc);
	            this.cerrarStatement(comDoc);
	            this.cerrarConexion(conDoc);
	        }
	        System.out.println(lisDoc.size());
	        return lisDoc;
	    }
	
	

	 public Calendario actualizar(Calendario pReg) throws DAOExcepcion {
			String cSql="UpDate MCalendario Set CalFecVacuna=?,CalProVacuna=?,CalFlg=?,MPaciente_PacCodigo,MPaciente_Especie_EspCodigo=?,MPaciente_MRaza_RazCodigo=?,MPaciente_MCliente_CliCodigo=?, TVacuna_VacCodigo, MProducto_TVacuna_VacCodigo=? Where CalCodigo=? And CalFlg<>'E'";
			Connection cCon=null;
			PreparedStatement cCom=null;
			try {
				cCon=ConexionBD.obtenerConexion();
				cCom=cCon.prepareStatement(cSql);
	            cCom.setString(1, pReg.getCalFecVacuna());
	            cCom.setString(2, pReg.getCalProVacuna());
	            cCom.setString(3, "M");
	            cCom.setInt(4, pReg.getEspecie().getEspCodigo());
	            cCom.setInt(5, pReg.getRaza().getRazCodigo());
	            cCom.setInt(6, pReg.getCliente().getCliCodigo());            
				cCom.setInt(7, pReg.getPaciente().getPacCodigo());
				cCom.setInt(8, pReg.getProducto().getProCodigo());
				cCom.setInt(7, pReg.getVacuna().getVacCodigo());
				int i = cCom.executeUpdate();
				if (i != 1) {
					throw new SQLException("No se pudo actualizar");
				}
			} catch (SQLException e) {
				System.err.println(e.getMessage());
				throw new DAOExcepcion(e.getMessage());
			} finally {
				this.cerrarStatement(cCom);
				this.cerrarConexion(cCon);
			}
			return pReg;
		}
	 
	 
	 
	 
	public Calendario insertar(Calendario pReg) throws DAOExcepcion {
        String cSql = "Insert Into MCalendario(CalFecVacuna,CalProVacuna,CalFlg,MPaciente_PacCodigo,mpaciente_MEspecie_EspCodigo,mpaciente_MRaza_RazCodigo,mpaciente_MCliente_CliCodigo,TVacuna_VacCodigo,tvacuna_MProducto_ProCodigo) Values (?,?,?,?,?,?,?,?,?)";
        Connection cCon = null;
        PreparedStatement cCom = null;
        ResultSet cRst = null;
        try {
            cCon = ConexionBD.obtenerConexion();
            cCom = cCon.prepareStatement(cSql);
            cCom.setString(1, pReg.getCalFecVacuna());
            cCom.setString(2, pReg.getCalProVacuna());
            cCom.setString(3,pReg.getCalFlg());
            cCom.setInt(4, pReg.getPaciente().getPacCodigo());
            cCom.setInt(5,pReg.getEspecie().getEspCodigo());
            cCom.setInt(6,pReg.getRaza().getRazCodigo());
            cCom.setInt(7, pReg.getCliente().getCliCodigo());
            cCom.setInt(8, pReg.getVacuna().getVacCodigo());
            cCom.setInt(9, pReg.getProducto().getProCodigo());
            int nroErr = cCom.executeUpdate();
            if (nroErr != 1) {
                throw new SQLException("No se pudo insertar");
            }
            int newCod = 0;
            cSql="Select Last_Insert_id()";
            cCom=cCon.prepareStatement(cSql);
            cRst=cCom.executeQuery();
            if (cRst.next()) {
                newCod=cRst.getInt(1);
            }
            pReg.setCalCodigo(newCod);

        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarResultSet(cRst);
            this.cerrarStatement(cCom);
            this.cerrarConexion(cCon);
        }
        return pReg;
    }

	
	public Calendario obtener(int pCod) throws DAOExcepcion {
        Calendario cReg = new Calendario();
        Connection cCon = null;
        PreparedStatement cCom = null;
        ResultSet cRst = null;
        try {
            String query = "Select CalCodigo,CalFecVacuna,CalProVacuna,MPaciente_PacCodigo,MPaciente_MEspecie_EspCodigo,MPaciente_MRaza_RazCodigo,MPaciente_MCliente_CliCodigo,TVacuna_VacCodigo,TVacuna_MProducto_ProCodigo From MCalendario Where CalCodigo=?";
            cCon=ConexionBD.obtenerConexion();
            cCom=cCon.prepareStatement(query);
            cCom.setInt(1, pCod);
            cRst=cCom.executeQuery();
            if (cRst.next()) {
                cReg.setCalCodigo(cRst.getInt(1));              
            }
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarResultSet(cRst);
            this.cerrarStatement(cCom);
            this.cerrarConexion(cCon);
        }
        return cReg;
    }
	
	public void eliminar(int pCod) throws DAOExcepcion {
        String cSql="Delete From MCalendario Where CalCodigo=?";
        Connection cCon=null;
        PreparedStatement cCom=null;
        try {
            cCon=ConexionBD.obtenerConexion();
            cCom=cCon.prepareStatement(cSql);
            cCom.setInt(1, pCod);
            int i = cCom.executeUpdate();
            if (i != 1) {
                throw new SQLException("No se pudo eliminar");
            }
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarStatement(cCom);
            this.cerrarConexion(cCon);
        }
    }

	
	public Collection<Calendario> listar() throws DAOExcepcion {
        Collection<Calendario> c = new ArrayList<Calendario>();
        Connection cCon=null;
        PreparedStatement cCom=null;
        ResultSet cRst=null;
        try {
            cCon = ConexionBD.obtenerConexion();
            String cSql="Select a.CalCodigo,a.CalFecVacuna,a.CalProVacuna,a.CalFlg,a.MPaciente_PacCodigo,a.MPaciente_MEspecie_EspCodigo,a.MPaciente_MRaza_RazCodigo,a.MPaciente_MCliente_CliCodigo,a.TVacuna_VacCodigo,a.TVacuna_MProducto_ProCodigo,b.PacNombre,c.EspNombre,d.RazNombre,g.ProNombre,h.VacNombre From MCalendario a, Mpaciente b,MEspecie c,MRaza d,MCliente e, MProducto g, TVacuna h where MPaciente_PacCodigo=b.PacCodigo And a.MPaciente_MEspecie_EspCodigo=c.EspCodigo And a.MPaciente_MRaza_RazCodigo=d.RazCodigo And a.MPaciente_MCliente_CliCodigo=e.CliCodigo And a.TVacuna_VacCodigo=h.VacCodigo And a.TVacuna_MProducto_ProCodigo=g.ProCodigo";
            cCom=cCon.prepareStatement(cSql);
            cRst=cCom.executeQuery();
            while (cRst.next()) {
                Calendario cCal = new Calendario();
                Paciente cPac = new Paciente();
                Especie cEsp=new Especie();
                Raza cRaz=new Raza();
                Cliente cCli=new Cliente();
                Vacuna cVac = new Vacuna();
                Producto cPro = new Producto();
                cCal.setCalCodigo(cRst.getInt("CalCodigo"));
                cCal.setCalFecVacuna(cRst.getString("CalFecVacuna"));
                cCal.setCalProVacuna(cRst.getString("CalProVacuna"));
                cCal.setCalFlg(cRst.getString("CalFlg"));
                cPac.setPacCodigo(cRst.getInt("MPaciente_PacCodigo"));
                cPac.setPacNombre(cRst.getString("PacNombre"));
                cEsp.setEspCodigo(cRst.getInt("MPaciente_MEspecie_EspCodigo"));
                cEsp.setEspNombre(cRst.getString("EspNombre"));
                cRaz.setRazCodigo(cRst.getInt("MPaciente_MRaza_RazCodigo"));
                cRaz.setRazNombre(cRst.getString("RazNombre"));
                cCli.setCliCodigo(cRst.getInt("MPaciente_MCliente_CliCodigo"));
                cVac.setVacCodigo(cRst.getInt("TVacuna_VacCodigo"));
                cVac.setVacNombre(cRst.getString("VacNombre"));
                cPro.setProCodigo(cRst.getInt("TVacuna_MProducto_proCodigo"));
                cPro.setProNombre(cRst.getString("proNombre"));
                cCal.setEspecie(cEsp);
                cCal.setRaza(cRaz);
                cCal.setCliente(cCli);
                cCal.setProducto(cPro);
                cCal.setVacuna(cVac);
                cCal.setPaciente(cPac);
                c.add(cCal);
            }
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarResultSet(cRst);
            this.cerrarStatement(cCom);
            this.cerrarConexion(cCon);
        }
        return c;
    }    
	
	
}
